#!/usr/bin/env python
import redis
import json
import sys
import time
from tasks import app

# Redis连接配置
REDIS_URL = 'redis://:Hewenyu1994@121.5.249.100:6379/0'
redis_client = redis.from_url(REDIS_URL)

def check_result_keys():
    """检查Redis中的所有结果键"""
    print("=== 检查Redis中的Celery结果键 ===")
    result_keys = []
    for key in redis_client.keys('celery-task-meta-*'):
        result_keys.append(key)
        key_str = key.decode('utf-8')
        task_id = key_str.replace('celery-task-meta-', '')
        result_data = redis_client.get(key)
        try:
            result_json = json.loads(result_data)
            print(f"任务 {task_id} 的结果:")
            print(json.dumps(result_json, indent=2, ensure_ascii=False))
        except:
            print(f"无法解析任务 {task_id} 的结果: {result_data}")
    
    return result_keys

def send_and_track_task():
    """发送任务并跟踪结果在Redis中的存储"""
    print("\n=== 发送新任务并跟踪结果 ===")
    
    # 清理旧的结果
    for key in redis_client.keys('celery-task-meta-*'):
        redis_client.delete(key)
    
    # 发送任务
    result = app.send_task(
        'tasks.add',
        args=[10, 20]
    )
    
    task_id = result.id
    print(f"已发送任务，ID: {task_id}")
    
    # 等待任务完成，同时监控Redis
    for i in range(10):
        time.sleep(0.5)
        print(f"\n检查Redis中的结果 (第 {i+1} 次):")
        
        # 检查结果键
        result_key = f'celery-task-meta-{task_id}'
        if redis_client.exists(result_key):
            result_data = redis_client.get(result_key)
            try:
                result_json = json.loads(result_data)
                print(f"找到结果: {json.dumps(result_json, indent=2, ensure_ascii=False)}")
                
                # 比较与Python API获取的结果
                api_result = result.get(timeout=1)
                print(f"通过Python API获取的结果: {api_result}")
                break
            except:
                print(f"找到结果但无法解析: {result_data}")
        else:
            print(f"尚未找到结果键: {result_key}")
    
    # 分析结果格式
    print("\n=== 分析结果格式 ===")
    result_key = f'celery-task-meta-{task_id}'
    if redis_client.exists(result_key):
        result_data = redis_client.get(result_key)
        try:
            result_json = json.loads(result_data)
            print("结果JSON格式:")
            print(json.dumps(result_json, indent=2, ensure_ascii=False))
            
            print("\nGo客户端应该完成以下工作来获取结果:")
            print("1. 在Redis中查找键: " + result_key)
            print("2. 解析JSON结果，结果值在 'result' 字段中")
            print("3. 确认任务状态 'status' 是否为 'SUCCESS'")
            print("\n建议的Go代码修改:")
            print("""
            func (cb *RedisBackend) GetResult(taskID string) (interface{}, error) {
                // 构造结果键
                resultKey := fmt.Sprintf("celery-task-meta-%s", taskID)
                
                // 从Redis获取结果
                result, err := cb.client.Get(cb.ctx, resultKey).Result()
                if err != nil {
                    if err == redis.Nil {
                        return nil, fmt.Errorf("result not found")
                    }
                    return nil, err
                }
                
                // 解析结果
                var resultData map[string]interface{}
                if err := json.Unmarshal([]byte(result), &resultData); err != nil {
                    return nil, fmt.Errorf("failed to parse result: %w", err)
                }
                
                // 检查任务状态
                status, _ := resultData["status"].(string)
                if status != "SUCCESS" {
                    errorMsg, _ := resultData["error"].(string)
                    if errorMsg != "" {
                        return nil, fmt.Errorf("task failed: %s", errorMsg)
                    }
                    return nil, fmt.Errorf("task status: %s", status)
                }
                
                // 返回结果
                return resultData["result"], nil
            }
            """)
        except Exception as e:
            print(f"分析结果时出错: {e}")
    else:
        print(f"找不到结果键: {result_key}")

def main():
    if len(sys.argv) > 1 and sys.argv[1] == "send":
        send_and_track_task()
    else:
        # 检查现有结果
        result_keys = check_result_keys()
        if not result_keys:
            print("\n没有找到任何结果键。请使用 'python inspect_result_backend.py send' 发送任务并生成结果。")
        
if __name__ == "__main__":
    main() 